package com.sufen.common.lag2;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.util.Locale;

/**
 * @description: Aware是发现知道的意思，这里通过继承ApplicationContextAware表示的是，MessageUtils可以
 * 获取ApplicationContext中的信息，这个类的功能是用来利用本地的多语配置来进行多语显示
 * @function:
 * @author: Liu Menglei
 * @Date: 2021/11/3 0003 22:49
 */

@Component
public class MessageUtils implements ApplicationContextAware {
    //这里的是Spring中用来处理多语的一个类
    private static MessageSource messageSource;

    //这里有有关getMessage的还有很多个多态方法，其中最关键的应该是关于MessageSource的使用
    //里面其他的代码都是为MessageSource服务的
    public static String getMessage(String code, Object[] args, String defaultMessage, Locale locale){
        if(messageSource == null){
            return defaultMessage;
        }
        if(locale==null){
            locale = getLocale();
        }
        String message = messageSource.getMessage(code,args,defaultMessage,locale);
        if (StringUtils.isEmpty(message)){
            message = defaultMessage;
        }
        return message;
    }

    public static String getMessage(String code){
        //这里面的这个是什么，这不是脱裤子放屁多次依据吗？
        //按理说应该传的是defaultMessage
        return getMessage(code,null,String.valueOf(code),getLocale());
    }

    public static String getMessage(String code,Object[] args){
        return getMessage(code,args,code,getLocale());
    }

    private static Locale getLocale() {
        //这里应该是一个获取本地环境相关的，但是目前不做深入的实现，可以获得是那个国家的
        return null;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        //getBean这个方法是多态的可以通过多种参数进行传递
        messageSource = applicationContext.getBean(MessageSource.class);

        //个人的理解是这里相当于是将自身的一个能力赋予更加细分领域，体现的好像确实是封装
        ExceptionMessageUtil.setMessageSource(new ExceptionMessageUtil.ExceptionMessageSource() {
            @Override
            public String getMessage(String code, Object[] args) {
                return MessageUtils.getMessage(code,args);
            }
        });

    }
}